<?php
header("Content-Type: text/html;charset=utf-8");
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/10
 * Time: 14:53
 * http://www.jb51.net/article/27392.htm
 */

/**
 * Interface Usb 多态的设计模式
 * “多态”是面向对象设计的重要特性，它展现了动态绑定（dynamic binding）的功能，也称为“同名异式”（Polymorphism）。
 * 多态的功能可让软件在开发和维护时，达到充分的延伸性（extension）。
 * 事实上，多态最直接的定义就是让具有继承关系的不同类对象，可以对相同名称的成员函数调用，产生不同的反应效果。
 */
interface Demo
{
    const HOST = "localhost";
    const USER = "admin";

    public function fun1();//声明方法不用加abstract，.接口中的成员访问权限，都必须是public,抽象类中最低的权限protected

    public function fun2();
}

/**
 *  1.如果子类是重写父接口中抽象方法，则使用implements(实现),类--接口，抽象类--接口 使用implements，接口--接口 使用extends(继承)
 *  2.可以使用抽象类去实现接口中的部分方法
 */
interface Demo2 extends Demo
{
    function fun3();

    function fun4();
}

interface Demo3
{
    function fun5();

    function fun6();
}

interface Demo4
{
    function fun7();
}

echo Demo::HOST;//可以访问接口中的常量
class Hello
{
    function fun8()
    {
    }
}

//子类必须实现接口中的所有方法
class UTest extends Hello implements Demo2, Demo3, Demo4
{ //实现多个接口
    function fun1()
    {
    }

    function fun2()
    {
    }

    function fun3()
    {
    }

    function fun4()
    {
    }

    function fun5()
    {
    }

    function fun6()
    {
    }

    function fun7()
    {
    }
}

/*-------------------多态---------------*/

interface Test
{
    function fun1();

    function fun2();
}

class One implements Test
{
    function fun1()
    {
        echo "aaaaaaaaa";
    }

    function fun2()
    {
        echo "bbbbbbbbbbbb";
    }
}

class Two implements Test
{
    function fun1()
    {
        echo "11111111";
    }

    function fun2()
    {
        echo "2222222222";
    }
}

//同一个接口，实现同一个方法，不同对象，输出不同。这就是多态的表现与应用
$test = new One;
$test->fun1();//输出一行 a
$test->fun2();//输出一行 b
$test = new Two;
$test->fun1();//输出一行 1
$test->fun2();//输出一行 2


/*--------------多态的一个应用实例 模拟USB设备的使用------------------*/

//一个USB的接口
interface USB
{
    const VER = 1.0;

    function mount();//装载USB的方法

    function work();//USB工作的方法

    function unmount();//卸载USB的方法
}

//定义一个USB设备 U盘
class Upan implements USB
{  //实现USB接口
    function mount()
    {
        echo " U盘 装载成功<br/>";
    }

    function work()
    {
        echo "U盘 开始工作<br/>";
    }

    function unmount()
    {
        echo "U盘 卸载成功<br/>";
    }
}

//定义一个鼠标设备
class mouse implements USB
{
    //实现USB接口
    function mount()
    {
        echo " U盘 装载成功<br/>";
    }

    function work()
    {
        echo "U盘 开始工作<br/>";
    }

    function unmount()
    {
        echo "U盘 卸载成功<br/>";
    }
}

//定义一个电脑类
class computer
{
    public function useUsb($obj)//$obj参数表示 使用哪种USB设备
    {
        $obj->mount();  //装载
        $obj->work(); //工作
        $obj->unmount(); //卸载
    }
}

//定义一个使用电脑的人类

class person
{
    //安装USB的方法
    public function install()
    {
        //首先拿来的一的电脑
        $computer = new computer();
        //再拿来一个设备 优盘 鼠标  键盘
        // 比拿来一个 鼠标
        $mouse = new mouse();
        //把拿来的鼠标插到电脑上
        $computer->useUsb($mouse);
    }
}

//实例化一个电脑用户
$per=new person();
$per->install();
